package com.czk.scala.chapter05

import scala.annotation.tailrec

/**
 * @Author:ChenZhangKun
 * @Date: 2021/12/29 18:47
 */
object Test10_Recursion {
  def main(args: Array[String]): Unit = {
    println(fact(5))

    println(tailFact(6))
  }

  /**
   * 递归求阶乘
   *
   * @param n
   * @return
   */
  def fact(n: Int): Int = {
    if (n == 0) return 1
    // 递归调用
    fact(n - 1) * n
  }

  /**
   * 尾递归
   * 做栈帧的覆盖而不是传统java的栈帧的叠加
   *
   * @param n 需要阶乘的数
   * @return
   */
  def tailFact(n: Int): Int = {
    // 计算中间结果
    @tailrec
    def loop(n: Int, result: Int): Int = {
      if (n == 0) return result
      loop(n - 1, n * result)
    }
    // 赋予初始值
    loop(n, 1)
  }
}
